package com.blog.wl2023.config.SaToken;

import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * @author wule
 * @desc sa-token拦截器。
 */
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {

	//用户和管理员都能访问的
	private final List<String> addInterceptorList
			= List.of("/api/logged/**", "api/com/userLogout", "api/qiniu/**");

	//管理员才能访问的
	private final List<String> addAdminInterceptorList
			= List.of("/api/admin/**");

	// 注册 Sa-Token 拦截器，打开注解式鉴权功能
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 注册 Sa-Token 拦截器，打开注解式鉴权功能
		//后期只要拦截个人信息修改和admin地址和
		registry.addInterceptor(new SaInterceptor(handel -> {
					//如果这个接口，要求客户端登录 Admin 和 User 账号任意一个，就能访问：
					SaRouter.match(addInterceptorList).check(r -> {
						if (!StpUtil.isLogin() && !StpAdminUtil.isLogin()) {
							throw new SaTokenException("请登录后再访问接口");
						}
					});
					//如果这个接口，要求客户端登录了后台 Admin 账号才能访问：
					SaRouter.match(addAdminInterceptorList).check(r -> {
						StpAdminUtil.checkLogin();
					});
				}))
				.addPathPatterns("/**");
	}


	@Autowired
	public void setSaTokenConfig() {
		// 设定 StpUtil 使用的 SaTokenConfig 配置参数对象
		SaTokenConfig config1 = new SaTokenConfig();
		config1.setTokenName("token");
		config1.setTokenStyle("random-64");
		StpUtil.stpLogic.setConfig(config1);

		// 设定 StpAdminUtil 使用的 SaTokenConfig 配置参数对象
		SaTokenConfig config2 = new SaTokenConfig();
		config2.setTokenName("token-admin");
		config2.setTokenStyle("simple-uuid");
		StpAdminUtil.stpLogic.setConfig(config2);
	}


}
